package com.线程案例.compleable;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author: LCG
 * @date: 2022-08-06 17:27:53
 * @description:
 **/
public class TestCompleableFuture {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //如果多个异步执行，如果下一个异步程序要依赖上一个的结果怎么办呢？
        //比如一个人要想娶媳妇，那就必须到达法定年龄 哈哈哈
        /** 按照顺序步骤进行执行的  將上一个 线程的执行结果传入下一个线程中使用 **/
        /*CompletableFuture<String> stringCompletableFuture = CompletableFuture.<Object>supplyAsync(() -> {
            return "第一步->长大到法定年龄";
        }).thenApplyAsync(th1 -> {
            return th1 + "->第二步->结婚";
        }).thenApplyAsync(th2->{
            return th2 + "->第三步->生子";
        });
        //获取结果
        String s = stringCompletableFuture.get();
        System.out.println(s);*/

        /**上述用法 还有一个相近的方法 thenCompose **/
                                                    /**说明：thenApply 相比于 thenCompose, thenApply需要返回的类型必须前后一致 ，
                                                     * 但是thenCompose 则可以最终返回最后一次执行的异步方法的类型**/
        //比如 如下的程序 可以利用第一步的结果在第二步中使用，但是第二步可以返回和第一步骤中不一样的类型
        CompletableFuture<Integer> integerCompletableFuture = CompletableFuture.<String>supplyAsync(() -> {
            return "第一步->长大到法定年龄";
        }).thenCompose(th1 -> CompletableFuture.<Integer>supplyAsync(() -> {
            System.out.println(th1);
            return 50;
        }));





    }
}
